package bdd;

import beans.Livre;
import java.sql.*;
import java.util.ArrayList;

public class QueriesLivre {

    Connection cnx;

    public QueriesLivre() throws ClassNotFoundException, SQLException {
        cnx = ConnectBDD.getSingleton();
    }

    /*===================================================================*/
    // Liste de tt les livres
    //      --> Retourne une liste de livres (array)
    /*===================================================================*/
    public ArrayList<Livre> listerLivres() throws SQLException {
        ArrayList<Livre> listLivres = new ArrayList();

        String req = "select * from T_LIVRES";
        System.out.println(req);
        Statement stm = cnx.createStatement();
        ResultSet res = stm.executeQuery(req);

        System.out.println("====> Appel de listerLivres()");

        while (res.next()) {
            Livre livre = new Livre();

            livre.setLivId(res.getInt("LIV_ID"));
            livre.setLivIsbn(res.getString("LIV_ISBN"));
            livre.setLivTitre(res.getString("LIV_TITRE"));
            livre.setLivSousTitre(res.getString("LIV_SOUSTITRE"));
            livre.setLivPrixHt(res.getFloat("LIV_PRIXHT"));
            livre.setLivResume(res.getString("LIV_RESUME"));
            livre.setLivDatePublication(res.getString("LIV_DATEPUBLICATION"));
            livre.setLivNbPages(res.getInt("LIV_NBPAGES"));
            livre.setLivStock(res.getInt("LIV_STOCK"));

            System.out.println(livre.toString());

            listLivres.add(livre);
        }
        return listLivres;
    }

    //*==================================================================*/
    // Liste des livres pour affichage page par page
    // Prend en parametre:
    //      --> le livId à partir duqhel il faut afficher  
    //      --> le nbre de livres par page
    //      --> Retourne une liste de livres (array)
    /*===================================================================*/
    /*  -- Selecte 4 lignes à partir de la 10eme en remontant (=7,8,9,10)
     *---------------------------------------------------------------------
     * SELECT * FROM ( 
     SELECT TOP 4 * FROM ( 
     SELECT TOP 10 * FROM  T_LIVRES ORDER BY LIV_ID asc
     ) AS tbl1 ORDER BY LIV_ID desc 
     ) AS tbl2 ORDER BY LIV_ID asc 
     * 
     *---------------------------------------------------------------------
     *  -- Autre Solution (RETENUE !!!) :
     * -- les 25 premières lignes :
     SELECT TOP 25 *
     FROM   T_LIVRES
     ORDER  BY LIV_ID

     -- Ce qui équivaut à :
     SELECT TOP 25 *
     FROM   T_LIVRES
     WHERE  LIV_ID NOT IN (SELECT TOP 0 LIV_ID
     FROM   T_LIVRES
     ORDER  BY LIV_ID)
     ORDER  BY LIV_ID
 
     -- les 25 suivantes :        
     SELECT TOP 25 *
     FROM   T_LIVRES
     WHERE  LIV_ID NOT IN (SELECT TOP 25 LIV_ID
     FROM   T_LIVRES
     ORDER  BY LIV_ID)
     ORDER  BY LIV_ID
     -- les 25 d'encore après :
     SELECT TOP 25 *
     FROM   T_LIVRES
     WHERE  LIV_ID NOT IN (SELECT TOP 50 LIV_ID
     FROM   T_LIVRES
     ORDER  BY LIV_ID)
     ORDER  BY LIV_ID        
     etc...
     *---------------------------------------------------------------------
     */
    public ArrayList<Livre> listerNbLivres(int livId, int nbLivresParPage) throws SQLException {
        ArrayList<Livre> listeLivres = new ArrayList();

        String req = "SELECT TOP " + nbLivresParPage + " * FROM T_LIVRES "
                + "WHERE  LIV_ID NOT IN "
                + "(SELECT TOP " + livId + " LIV_ID FROM T_LIVRES ORDER  BY LIV_ID) "
                + "ORDER  BY LIV_ID";
        System.out.println(req);
        Statement stm = cnx.createStatement();
        ResultSet res = stm.executeQuery(req);

        System.out.println("====> Appel de listerNbLivres(" + livId + "," + nbLivresParPage + ")");

        while (res.next()) {
            Livre livre = new Livre();

            livre.setLivId(res.getInt("LIV_ID"));
            livre.setLivIsbn(res.getString("LIV_ISBN"));
            livre.setLivTitre(res.getString("LIV_TITRE"));
            livre.setLivSousTitre(res.getString("LIV_SOUSTITRE"));
            livre.setLivPrixHt(res.getFloat("LIV_PRIXHT"));
            livre.setLivResume(res.getString("LIV_RESUME"));
            String full = res.getString("LIV_DATEPUBLICATION");
            String part1 = full.substring(0, 4);
            String part2 = full.substring(5, 7);
            livre.setLivDatePublication(part2 + "/" + part1);
            livre.setLivNbPages(res.getInt("LIV_NBPAGES"));
            livre.setLivStock(res.getInt("LIV_STOCK"));

            System.out.println(livre.toString());

            listeLivres.add(livre);
        }
        return listeLivres;
    }

    /*===================================================================*/
    // Search sur Livres comportant un motCle ds le Titre ou le resumé
    //      --> le offset à partir duqhel il faut afficher  
    //      --> le nbre de livres par page
    // --> Retourne une liste d'Events
    /*===================================================================*/
    //  use shop_v3;
    //
    // SELECT TOP 4 * FROM T_LIVRES WHERE (LIV_RESUME LIKE '%lorem%') AND 
    //     ( LIV_ID NOT IN 
    //			( SELECT TOP 0 LIV_ID FROM T_LIVRES WHERE LIV_RESUME LIKE '%lorem%' ORDER  BY LIV_ID
    //			)
    //      ) ORDER  BY LIV_ID
    // SELECT TOP 4 * FROM T_LIVRES WHERE (LIV_RESUME LIKE '%lorem%') AND 
    //     ( LIV_ID NOT IN 
    //			( SELECT TOP 4 LIV_ID FROM T_LIVRES WHERE LIV_RESUME LIKE '%lorem%' ORDER  BY LIV_ID
    //			)
    //      ) ORDER  BY LIV_ID
    // SELECT TOP 4 * FROM T_LIVRES WHERE (LIV_RESUME LIKE '%lorem%') AND 
    //     ( LIV_ID NOT IN 
    //			( SELECT TOP 8 LIV_ID FROM T_LIVRES WHERE LIV_RESUME LIKE '%lorem%' ORDER  BY LIV_ID
    //			)
    //      ) ORDER  BY LIV_ID
    //
    public ArrayList<Livre> searchLivres(int offset, int page, String motCle) throws SQLException {
        ArrayList<Livre> listeLivres = new ArrayList();

        String req = "SELECT TOP "
                + page
                + " * FROM (T_LIVRES  JOIN T_GENRES ON T_LIVRES.GEN_ID = T_GENRES.GEN_ID) WHERE "
                + " ("
                + "LIV_TITRE LIKE "
                + "'%" + motCle + "%'"
                + " OR LIV_RESUME LIKE "
                + "'%" + motCle + "%'"
                + " OR LIV_ISBN LIKE "
                + "'%" + motCle + "%'"
                + " OR GEN_LABEL LIKE "
                + "'%" + motCle + "%'"
                + ")"
                + " AND "
                + "("
                + "LIV_ID NOT IN "
                + "("
                + "SELECT TOP "
                + offset 
                + " LIV_ID FROM (T_LIVRES JOIN T_GENRES ON T_LIVRES.GEN_ID = T_GENRES.GEN_ID)"
                + " WHERE LIV_TITRE LIKE "
                + "'%" + motCle + "%'"
                + " OR LIV_RESUME LIKE "
                + "'%" + motCle + "%'"
                + " OR LIV_ISBN LIKE "
                + "'%" + motCle + "%'"
                + " OR GEN_LABEL LIKE "
                + "'%" + motCle + "%'"
                + " ORDER BY LIV_ID"
                + ")"
                + ")"
                + " ORDER  BY LIV_ID";

        System.out.println(req);
        Statement stm = cnx.createStatement();
        ResultSet res = stm.executeQuery(req);

        System.out.println("====> Appel de searchLivres(" + motCle + "," + offset + "," + page + ")");

        while (res.next()) {
            Livre livre = new Livre();

            livre.setLivId(res.getInt("LIV_ID"));
            livre.setLivIsbn(res.getString("LIV_ISBN"));
            livre.setLivTitre(res.getString("LIV_TITRE"));
            livre.setLivSousTitre(res.getString("LIV_SOUSTITRE"));
            livre.setLivPrixHt(res.getFloat("LIV_PRIXHT"));
            livre.setLivResume(res.getString("LIV_RESUME"));
            livre.setLivDatePublication(res.getString("LIV_DATEPUBLICATION"));
            livre.setLivNbPages(res.getInt("LIV_NBPAGES"));
            livre.setLivStock(res.getInt("LIV_STOCK"));

            System.out.println(livre.toString());
            listeLivres.add(livre);
        }
        return listeLivres;
    }

    ////////////////////////////////////////////////////////////////////////////////////////
    // LOIC
    //////////////////////////////////////////////////////////////////////////////////
    public Livre afficherLivre(int id) throws SQLException {
        CallableStatement cstmt = cnx.prepareCall("{call ps_detaillivre(?)}");
        cstmt.setInt(1, id);
        ResultSet res = cstmt.executeQuery();

        Livre livre = new Livre();
        while (res.next()) {
            livre.setLivId(res.getInt("LIV_ID"));
            livre.setLivIsbn(res.getString("LIV_ISBN"));
            livre.setLivTitre(res.getString("LIV_TITRE"));
            livre.setLivSousTitre(res.getString("LIV_SOUSTITRE"));
            livre.setLivResume(res.getString("LIV_RESUME"));
            livre.setLivNbPages(res.getInt("LIV_NBPAGES"));
            String full = res.getString("LIV_DATEPUBLICATION");
            String part1 = full.substring(0, 4);
            String part2 = full.substring(5, 7);
            livre.setLivDatePublication(part2 + "/" + part1);
            livre.setLivStock(res.getInt("LIV_STOCK"));
            livre.setLivPrixHt(res.getFloat("LIV_PRIXHT") + res.getFloat("LIV_PRIXHT") * res.getFloat("TVA_TAUX"));
            livre.setEdiNom(res.getString("EDI_NOM"));
            livre.setGenLabel(res.getString("GEN_LABEL"));
            livre.setEveLabel(res.getString("EVE_LABEL"));
        }
        return livre;
    }

    /*alt methodes pour pagination*/
    public int getNbLivres() throws SQLException {
        CallableStatement cstmt = cnx.prepareCall("{call ps_comptlivres(?)}");
        cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
        cstmt.execute();
        int nbLivres = cstmt.getInt(1);

        return nbLivres;
    }

    public ArrayList<Livre> getPgLivres(int deb, int ligpage) throws SQLException {
        CallableStatement cstmt = cnx.prepareCall("{call ps_afflivres(?,?)}");
        cstmt.setInt(1, deb);
        cstmt.setInt(2, ligpage);
        ResultSet res = cstmt.executeQuery();

        ArrayList<Livre> listing = new ArrayList();

        while (res.next()) {
            Livre livre = new Livre();

            livre.setLivId(res.getInt("LIV_ID"));
            livre.setLivIsbn(res.getString("LIV_ISBN"));
            livre.setLivTitre(res.getString("LIV_TITRE"));
            livre.setLivSousTitre(res.getString("LIV_SOUSTITRE"));
            livre.setLivResume(res.getString("LIV_RESUME"));
            livre.setLivNbPages(res.getInt("LIV_NBPAGES"));
            String full = res.getString("LIV_DATEPUBLICATION");
            String part1 = full.substring(0, 4);
            String part2 = full.substring(5, 7);
            livre.setLivDatePublication(part2 + "/" + part1);
            livre.setLivStock(res.getInt("LIV_STOCK"));
            livre.setLivPrixHt(res.getFloat("LIV_PRIXHT") + res.getFloat("LIV_PRIXHT") * res.getFloat("TVA_TAUX"));
            livre.setEdiNom(res.getString("EDI_NOM"));
            livre.setGenLabel(res.getString("GEN_LABEL"));
            livre.setEveLabel(res.getString("EVE_LABEL"));

            listing.add(livre);
        }

        return listing;
    }
}
